#ifndef PROGRAM_H
#define PROGRAM_H
#include <libmscommon/msbitrate.h>
#define PCR_PIDSHARE_PROGRAM		(1<<0)
#define PCR_PIDSHARE_VIDEO			(1<<1)
#define PCR_PIDSHARE_AUDIO			(1<<2)
#define PCR_PIDSHARE_OTHERES		(1<<3)

typedef struct PROGRAMInfo{
//节目ID：TS中用于和SDT表中的服务信息进行关联
	ms_u16 program_num;
//[TS专用]PMT表的PID
	ms_u16 pmt_pid;
//[TS专用]PCR表的PID
	ms_u16 pcr_pid;	
	ms_bool sharePid; //是否共用PID
	ms_u16 sharePid_num;
	ms_u16 sharePid_program_num[MAX_PROGRAM];
//流中的ES信息	
	ms_s08 num_es; 
	ESInfo esInfo[MAX_ES];
//[TS专用]是否有服务信息	
	ms_bool flag_hasSdt;
	ms_byte service_type[256];
	ms_byte service_name[256];
	ms_byte service_provider_name[256];
	
//[TS专用]记录PCR和PMT的发送间隔时间
	MPEGTSPeriod period_pcr;
	MPEGTSPeriod period_pmt;
//[TS专用]检测PMT的CC；PCR可能和视频PID相同，不方便统计CC；	
	CTUCOUNTERInfo ctuInfo_pmt;
	CTUCOUNTERInfo ctuInfo_pcr;
//[TS专用]用于MPTS输入，SPTS输出	
	ms_s32 len;
	ms_byte buf[2048];
	ms_byte buf_table[(3*TS_SIZE_MAX)];//Pat、Pmt和Sdt
	ms_byte ctu_counter;//用于维护PAT、PMT和SDT表的连续计数器
	ms_bool flag_out;//标记是否节目输出
}PROGRAMInfo;

typedef struct PIDContxt{
	ms_bool flag_use;
	ms_u16 program_num;//标记所属节目
	ms_u16 pid;
	ms_u32 num;
	ms_byte percentage[8];
	STREAMRATEInfo streamrate_info;
	ms_byte info[512];
}PIDContxt;

typedef struct PIDLISTContxt{
	STREAMRATEInfo streamrate_info;
	ms_u32 totalPid;
	PIDContxt pid_ctt[MAX_PROGRAM*MAX_ES];
}PIDLISTContxt;

typedef struct ERRLEVEL1Contxt{
	ms_u32 syncLost;	//同步丢失，连续检测到2个以上无效同步字节。故障现象：黑屏、静帧、马赛克、画面不流畅
	ms_u32 syncErr;		//同步字节错误，与同步丢失类似但TS包长度正常，仅同步字节被篡改。故障现象：黑屏、静帧、马赛克、画面不流畅
	ms_u32 patErr;		//PAT错误，未在0.5秒内更新、内容缺失或被加密。故障现象：无法搜索到节目或节目信息错误
	ms_u32 ccErr;		//连续计数错误。故障现象：如果是视音频，会导致马赛克等现象
	ms_u32 ccErr_av;	//只统计音视频的连续计数错误
	ms_u32 pmtErr;		//PMT错误，未在0.5秒内更新、内容缺失或被加密。故障现象：节目无法解码或切换失败
	ms_u32 pidErr;		//[日志]关键PID丢失或未传输，包括PAT、PMT、PCR和音视频等。故障现象：特定节目或服务无法解码
}ERRLEVEL1Contxt;
typedef struct ERRLEVEL2Contxt{
	ms_u32 TEI;			//传输错误，传送包错误指示为“1”
	ms_u32 crcErr;		//CRC错误，PSI/SI表（如PAT、PMT）的CRC校验失败，表内数据损坏
	ms_u32 pcrIntervalErr;//PCR间隔错误，PCR发送间隔超过100ms。故障现象：出现卡顿，延迟等现象
	ms_u32 pcrDIErr;	//PCR非连续错误，PCR差值不得大于100ms。故障现象：解码和显示画面不同步
	ms_u32 no_pcrAccuracyErr;//PCR抖动错误，PCR的精度必须必须高于500ns或抖动量不得大于(-500,+500)ns。故障现象：出现解码和显示画面不同步
	ms_u32 ptsErr;	//PTS错误，PTS发送间隔大于700ms
	ms_u32 no_catErr;	//CAT错误，TS包头中的加密控制段不为0。故障现象：导致解扰节目失败
}ERRLEVEL2Contxt;
typedef struct ERRLEVEL3Contxt{
	ms_u32 infoChange;	//[日志]流信息发生了改变，目前主要包括PAT表中的总节目数、节目号、PMT的PID，PMT中的总节目数、PCR的PID、ES数量、ES信息（PID、流类型）；
	ms_u32 sdtErr;		//SDT错误，未在1分钟内更新、内容缺失或被加密。故障现象：无法获取节目服务信息
/*
	//网络状态、频道列表或节目指南显示异常
	​​//NIT/SDT/EIT错误​​。NIT（网络信息表）、SDT（服务描述表）等表未按时更新
	//短暂卡顿，无实际数据丢失
​​	​​//空缓冲器错误​​。解码器缓冲区短暂溢出|下溢，通常由网络抖动引起
*/
}ERRLEVEL3Contxt;

typedef struct MONITORInfo{
	/*错误信息（TR101290）*/
//一级错误（致命错误）​​​​，导致​​无法解码​​或​​完全中断​	
	ERRLEVEL1Contxt errLevel1_ctt;
//二级错误（​	​​严重错误），影响​​单频道解码​​和​​播放质量​​，但不会造成完全停播​​	
	ERRLEVEL2Contxt errLevel2_ctt;
//三级错误（轻微问题），主要影响​​业务信息​​和​​附加功能​
	ERRLEVEL3Contxt errLevel3_ctt;
}MONITORInfo;

typedef struct STREAMInfo{
//流标记：用于识别
	ms_byte tag[256];
//流格式
	ms_byte format[128];
//流中的总节目数：
	ms_s32 totalnum_program_real;	
//实际解析的节目数：当节目数量大于MAX_PROGRAM时，program_totalnum=MAX_PROGRAM
	ms_s32 totalnum_program;
//流的数量
	ms_u32 nb_streams;
	ms_u32 nb_video;
	ms_u32 nb_audio;
//流中的节目信息
	PROGRAMInfo program_info[MAX_PROGRAM];	

//[TS专用]包长度
	ms_u08 pktSize;
//[TS专用]解析流信息的进度
	ms_u08 progress;
//[TS专用]告警监测信息
	MONITORInfo monitorInfo;
//[TS专用]记录PAT和SDT的发送间隔时间	
	MPEGTSPeriod period_pat;
	MPEGTSPeriod period_sdt;
//[TS专用]检测PAT和SDT的CC
	CTUCOUNTERInfo	ctuInfo_pat;
	CTUCOUNTERInfo	ctuInfo_sdt;
//[TS专用]PID统计列表
	PIDLISTContxt pidList_ctt;
//[TS专用]标记是否重新生成PAT、PMT或SDT
	ms_bool flag_rebuild_pat;
	ms_bool flag_rebuild_pmt;
	ms_bool flag_rebuild_sdt;
}STREAMInfo;

#endif

